package com.ruoyi.common.config.mybatis.method;

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;

import java.text.MessageFormat;

/**
 * @Classname AbstractLogicRecoveryMethod
 * @Author: sunluquan
 * @Date: 2021/12/23 18:00
 * @Description TODO
 * 只有逻辑删除字段的表  才需要使用  恢复删除标识为未删除
 */
public abstract class AbstractLogicRecoveryMethod  extends AbstractMethod {

    @Override
    public final MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        if (!tableInfo.isWithLogicDelete()) {
            throw new UnsupportedOperationException(MessageFormat.format("table:{} 未找到标记有 TableLogic注解的字段 不能使用此类！",tableInfo.getTableName()));
        }
        return reachableInjectMappedStatement(mapperClass,modelClass,tableInfo);
    }

    /**
     * 逻辑删除恢复的sql注入器 可达的注入映射语句
     * @param mapperClass
     * @param modelClass
     * @param tableInfo
     */
    public abstract MappedStatement reachableInjectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo );

    /**
     * 设置逻辑不删除语句  最终会得到 delFlag = 1 其中 delFlag表示删除标识字段  1标记为不删除
     * @param tableInfo
     * @return
     */
    protected String sqlLogicNotDeleteSet(TableInfo tableInfo){
        return  "SET " + tableInfo.getLogicDeleteSql(false,true);
    }

    /**
     * 设置条件 最终会得到 and delFlag=0 其中 delFlag标识删除的标识字段 0标记为删除
     * @param tableInfo
     * @return
     */
    protected String sqlLogicDeleteWhere(TableInfo tableInfo){
        /*isWhere:true 表示  delFlag=不删除（1）
         * false 表示 delFlag=删除(0)
         * startWithAnd 是否在 delFlag=？前面加 and
         * true 加and false 不加 and*/
        return tableInfo.getLogicDeleteSql(true, false);
    }
}
